package edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.controller;

import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.config.JwtConfig;
import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.entity.SysUserEntity;
import edu.ynu.se.xiecheng.achitectureclass.digitalagriculture.service.SysUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 用户控制器
 * 设计原则体现：
 * 1. MVC架构模式 - 作为Controller层处理用户认证相关请求
 * 2. 单一职责原则(SRP) - 专注于用户认证和信息获取功能
 */
@RequestMapping("/user")
@RestController
public class SysUserController {

    // 依赖注入原则 - 使用@Resource注入依赖，降低耦合
    @Resource
    private SysUserService service;
    @Resource
    private JwtConfig jwtConfig;

    /**
     * 获取登录信息
     * 设计原则体现：
     * 1. 防御性编程 - 对token进行空值和有效性检查
     * 2. 关注点分离 - token验证与用户信息获取分离
     */
    @GetMapping("/getLoginInfo")
    public SysUserEntity getLoginInfo(String token) {
        // 防御性编程 - 空值检查
        if (token == null) {
            return new SysUserEntity();
        }

        String userId = null;
        try {
            // 关注点分离 - JWT token解析
            userId = jwtConfig.getUsernameFromToken(token);
        } catch (Exception e) {
            System.out.println("token错误或失效");
            return new SysUserEntity();
        }

        // 分层架构 - 通过Service层获取用户信息
        SysUserEntity sysUserEntity = service.getById(Long.valueOf(userId));

        // 防御性编程 - 空值检查
        if (sysUserEntity == null) {
            return new SysUserEntity();
        }
        return sysUserEntity;
    }

    /**
     * 登录
     * 设计原则体现：
     * 1. 职责链模式 - 验证、token生成的链式处理
     * 2. 迪米特法则 - 通过Service层处理用户验证
     */
    @GetMapping("/login")
    public String login(String name, String pwd) {
        // 分层架构 - 委托Service层处理用户验证
        SysUserEntity sysUserEntity = service.getByUserAndPwd(name, pwd);

        // 防御性编程 - 验证失败处理
        if (sysUserEntity == null) {
            return "notExist";
        }

        // 关注点分离 - token生成逻辑
        String token = jwtConfig.createToken(sysUserEntity.getId());
        return token;
    }
}
